// 如果obj里有RegExp、Error对象，则序列化的结果将只得到空对象

// 如果obj里面有时间对象，则JSON.stringify后再JSON.parse的结果，时间将只是字符串的形式。而不是时间对象

// 如果obj里有函数，undefined，则序列化的结果会把函数或 undefined丢失

// 如果obj里有NaN、Infinity和-Infinity，则序列化的结果会变成null

// 无法处理function，无法处理循环引用对象
export const jsonClone = function (targetObj) {
    return JSON.parse(JSON.stringify(targetObj))
}


// 比较好的深拷贝
export const deepClone = function (targetObj) {

    if (typeof targetObj !== 'object') {
        return targetObj;
    }

    let resultObj = {}

    for (let key in targetObj) {

        // 如果是对象
        if (typeof targetObj[key] === 'object') {
            //对数组特殊处理
            if (Array.isArray(targetObj[key])) {

                //用map方法返回新数组，将数组中的元素递归
                resultObj[key] = targetObj[key].map(item => this.deepClone(item))
            } else {
                //递归返回新的对象
                resultObj[key] = deepClone(targetObj[key]);
            }
        } else if (typeof targetObj[key] === 'function') {
            //返回新函数
            resultObj[key] = targetObj[key].bind(resultObj);
        } else {
            //基本类型直接返回
            resultObj[key] = targetObj[key];
        }
    }
    return resultObj;
}


// const obj = {
//     a: 1,
//     b: {},
//     c: {
//         d: {},
//         g: () => {}
//     },
//     e: () => {},
//     f: function () {}
// }
// const newObj = deepClone(obj);
// console.log(
//     newObj.a === obj.a, //true
//     newObj.b === obj.b, //false
//     newObj.c === obj.c, //false
//     newObj.c.d === obj.c.d, //false
//     newObj.c.g === obj.c.g, //false
//     newObj.e === obj.e, //false
//     newObj.f === obj.f, //false
// )